home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 41.zip / BS1 part 41 / Abacus diskdrives IO.adf / Assembler / Speeder.s < prev    next >
Text File  |  1978-06-28  |  27KB  |  898 lines

  1. ; listing of floppy speeder.s
  2. DeviceList     EQU 350
  3. TrackTask      EQU 302
  4. TrackPort      EQU 36
  5. SPReg          EQU 54
  6. ReplyAddress   EQU 70
  7. IDNestCnt      EQU 294
  8. PortStatus     EQU 34
  9. CMD_READ       EQU 2
  10. FindName       EQU -276
  11. Wait           EQU -318
  12. AllocMem       EQU -198
  13. FreeMem        EQU -210
  14.  
  15. Req1           EQU $01                   ;MEMF_PUBLIC
  16. Req2           EQU $03
  17. TrackSize      EQU $1604                 ;Number of Bytes in one Track
  18.  
  19. ReadError      EQU 21
  20. NoDisk         EQU 29
  21. NoSync         EQU 21
  22.  
  23.                lea $fc0000,a0
  24.                cmp.l #$2033332E,$1c(a0)
  25.                bne \DError4
  26.                cmp.l #$31393220,$20(a0)               bne \DError4
  27.                move.l $4,a6
  28.                bsr Disable
  29.                move.l #Ende-Start1,d0
  30.                move.l #Req1,d1
  31.                jsr AllocMem(a6)
  32.                move.l d0,a1
  33.                move.l a1,a4              ;Save memory address
  34.                move.l d0,d4
  35.                beq \DError1
  36.                lea TrackName(pc),a1
  37.                lea DeviceList(a6),a0
  38.                jsr FindName(a6)
  39.                tst.l d0
  40.                beq \DError3
  41.                move.l d0,a5
  42.  
  43.                lea MyTask(pc),a0               lea Start1(pc),a1
  44.                suba.l a1,a0
  45.                adda.l a0,a4              ;Address of  MyTask
  46.                clr.l d3
  47. \l3:           move.l TrackPort(a5,d3),d0
  48.                beq \l5
  49.                move.l d0,a3
  50.                move.l #TrackSize,d0
  51.                move.l #Req2,d1
  52.                jsr AllocMem(a6)
  53.                lea TrackMemory1(pc),a0               lea (a0,d3),a0            ;Track Memory for Disk
  54.                move.l d0,(a0)
  55.                beq \DError2
  56. \l1:           btst #0,PortStatus(a3)    ;wait, until Task in Wait
  57.                bne \l1
  58.                move.l #1800,$2c(a3)      ;accelerate Step motor
  59.                move.l #1,$30(a3)         ;no wait after Posi.
  60.                lea TrackTask+SPReg(a3),a2
  61.                move.l (a2),a1
  62.                move.l a4,ReplyAddress(a1)
  63. \l5:           addq.l #4,d3
  64.                cmpi.w #16,d3
  65.                bcs \l3
  66.  
  67.                move.l #Ende-Start1,d0
  68.                lea Start1(pc),a0
  69.                move.l d4,a1
  70. \l4:           move.b (a0)+,(a1)+        ;Copy data
  71.                subq.l #1,d0
  72.                bne \l4
  73.                bsr blink
  74. \DError1:
  75.                bsr Enable
  76. \DError4:      clr.l d0
  77.                rts
  78. \DError2:      subq.l #4,d3
  79.                bcs \DError3
  80.                lea TrackMemory1(pc),a0
  81.                lea (a0,d3),a0
  82.                move.l (a0),a1
  83.                move.l #TrackSize,d0
  84.                jsr FreeMem(a6)
  85.                bra \DError2
  86. \DError3:      move.l #Ende-Start1,d0
  87.                move.l a4,a1
  88.                jsr FreeMem(a6)
  89.                bra \DError1
  90.  
  91. Blink:         move.l D0,-(a7)
  92.                move.l #$20000,d0
  93. \l1:           move.w d0,$dff180
  94.                sub.l #1,d0
  95.                bne \l1
  96.                move.l (a7)+,D0
  97.                rts
  98.  
  99. Start1:
  100. Disable:       move.w #$4000,$dff09a
  101.                move.l a6,-(a7)
  102.                move.l $4,a6
  103.                add.b #1,IDNestCnt(a6)
  104.                move.l (a7)+,a6
  105.                rts
  106. Enable:        move.l a6,-(a7)
  107.                move.l $4,a6
  108.                sub.b #1,IDNestCnt(a6)
  109.                bge \l1
  110.                move.w #$c000,$dff09a
  111. \l1:           move.l (a7)+,a6
  112.                rts
  113.  
  114. TheTask:       MOVEA.L 8(A7),A6
  115.                MOVEA.L 4(A7),A3
  116.                LEA $12E(A3),A0
  117.                MOVE.L A0,$10(A3)
  118.                JSR $FE9960
  119. LFEAE64:       BSR.S LFEAE7A
  120.                MOVE.L #$300,D0
  121.                MOVE.L A6,-(A7)
  122.                MOVEA.L $34(A6),A6
  123.                JSR Wait(A6)
  124. MyTask:        MOVEA.L (A7)+,A6
  125.                BRA.S LFEAE64
  126. LFEAE7A:       BSET #0,$22(A3)
  127.                BNE NoMessage
  128. LFEAE84:       MOVEA.L A3,A0
  129.                MOVE.L A6,-(A7)
  130.                MOVEA.L $34(A6),A6
  131.                JSR -$174(A6)
  132.                MOVEA.L (A7)+,A6
  133.                TST.L D0
  134.                BEQ LFEAF3E
  135.                MOVEA.L D0,A2
  136.                BCLR #3,$40(A3)
  137.                BEQ LFEAF1E
  138.                MOVEA.L $52(A3),A0
  139.                BCLR #0,2(A0)
  140.                BEQ LFEAEBA
  141.                MOVE.L A0,$4E(A3)
  142.                JSR $FEA958
  143. LFEAEBA:       MOVEA.L $52(A3),A0
  144.                MOVEQ #-1,D0
  145.                MOVE.W D0,0(A0)
  146.                MOVE.W D0,$4C(A3)
  147.                MOVEQ #0,D0
  148.                JSR $FEA462
  149.                MOVEA.L A6,A0
  150.                MOVEA.L $34(A0),A6
  151.                ADDQ.B #1,$127(A6)
  152.                MOVEA.L A0,A6
  153.                TST.W $24(A3)
  154.                BNE LFEAF12
  155.                MOVEQ #0,D0
  156.                MOVE.B $43(A3),D0
  157.                MOVE.L A6,-(A7)
  158.                MOVEA.L $3C(A6),A6
  159.                JSR -$C(A6)
  160.                MOVEA.L (A7)+,A6
  161.                LEA $24(A6),A0
  162.                MOVEQ #0,D0
  163.                MOVE.B $43(A3),D0
  164.                LSL.L #2,D0
  165.                ADDA.L D0,A0
  166.                CLR.L (A0)
  167.                SUBA.L A1,A1
  168.                MOVE.L A6,-(A7)
  169.                MOVEA.L $34(A6),A6
  170.                JSR -$120(A6)
  171.                MOVEA.L (A7)+,A6
  172. LFEAF12:       MOVE.L A6,-(A7)
  173.                MOVEA.L $34(A6),A6
  174.                JSR -$8A(A6)
  175.                MOVEA.L (A7)+,A6
  176. LFEAF1E:       MOVEA.L A2,A1
  177.                LEA $86(A3),A0
  178.                CMPA.L A0,A2
  179.                BNE.S LFEAF30
  180.                JSR $FE9960
  181.                BRA LFEAE84
  182. LFEAF30:       BSET #1,$22(A3)
  183.                bsr Stepper1
  184.                BRA LFEAE84
  185. LFEAF3E:       BCLR #1,$22(A3)
  186.                BCLR #0,$22(A3)
  187. NoMessage:     RTS
  188.  
  189. Stepper1:      MOVE.L A2,-(A7)
  190.                MOVEA.L A1,A2
  191.                ANDI.B #-6,$40(A3)
  192.                jsr $FE998C
  193.                MOVEA.L A2,A1
  194.                MOVE.W $1C(A2),D0
  195.                cmp.b #CMD_READ,d0
  196.                beq Stepper2
  197.                BTST #$F,D0
  198.                BEQ.S LFEA052
  199.                BSET #2,$40(A3)
  200.                MOVE.L $126(A3),D1
  201.                CMP.L $30(A2),D1
  202.                BLS.S LFEA052
  203.                MOVE.B #$1D,$1F(A2)
  204.                JSR $FEA1B0
  205.                BRA.S LFEA066
  206. LFEA052:       MOVEQ #0,D1
  207.                MOVE.B D0,D1
  208.                LSL.W #2,D1
  209.                LEA $FEA300,A0
  210.                MOVEA.L 0(A0,D1.W),A0
  211.                JSR (A0)
  212. LoadEnde:
  213.                JSR $FE998C
  214. LFEA066:       MOVEA.L (A7)+,A2
  215.                RTS
  216.  
  217. Stepper2: ;     bsr Blink
  218.                bsr Stepper3
  219.                bra LoadEnde
  220.  
  221. Stepper3:
  222.  MOVEM.L A2-A4,-(A7)
  223.  MOVEA.L $18(A1),A3
  224.  MOVEA.L A1,A2
  225.  MOVE.L A2,$44(A3)
  226.  MOVE.L #0,$20(A2)
  227.  MOVE.L $28(A2),$56(A3)
  228.  MOVE.L $2C(A2),D0
  229.  JSR $FEA182
  230.  TST.L D0
  231.  BMI LFEA92A
  232.  MOVE.W D0,$4A(A3)
  233.  MOVE.B D1,$49(A3)
  234.  MOVE.L $2C(A2),D0
  235.  ADD.L $24(A2),D0
  236.  JSR $FEA182
  237.  TST.L D0
  238.  BMI LFEA92A
  239.  BTST #2,$40(A3)
  240.  BEQ.S LFEA78E
  241.  MOVE.L $34(A2),$5A(A3)
  242.  BEQ.S LFEA78E
  243.  BSET #0,$40(A3)
  244. LFEA78E:BTST #1,$40(A3)
  245.  BEQ.S LFEA7A0
  246.  MOVE.B #$1D,$1F(A2)
  247.  BRA LFEA920
  248. LFEA7A0:MOVE.W $4A(A3),D0
  249.  JSR $FEA93C
  250.  MOVE.L A0,$4E(A3)
  251.  BNE.S LFEA804
  252.  jsr $FEA952 MOVEA.L A0,A2
  253.  MOVE.L A2,$4E(A3)
  254. LFEA7B8:BTST #0,2(A2)                    ;Track in buffer
  255.  BEQ.S LFEA7D4                           ;No, read one
  256.  JSR $FEA958
  257.  TST.L D0
  258.  BEQ.S LFEA7D4
  259.  MOVEA.L $44(A3),A1
  260.  MOVE.B D0,$1F(A1)
  261.  BRA LFEA920
  262. LFEA7D4:MOVE.W $4A(A3),0(A2)
  263.  BCLR #0,2(A2)
  264.  CLR.B $42(A3)
  265.  bsr read1                               ;read track into buffer
  266.  MOVE.B 3(A2),D0
  267.  CMPI.B #$B,D0
  268.  BCS.S LFEA804
  269.  MOVE.W #-1,0(A2)
  270.  MOVEA.L $44(A3),A1
  271.  MOVE.B D0,$1F(A1)
  272.  BRA LFEA920
  273. LFEA804:MOVEA.L $44(A3),A2
  274.  MOVE.W $1C(A2),D0
  275.  MOVEA.L $4E(A3),A0
  276.  CMPI.B #3,D0
  277.  BNE LFEA890
  278.  BSET #0,2(A0)
  279.  MOVEQ #0,D0
  280.  MOVE.B $49(A3),D0
  281.  SUB.B 3(A0),D0
  282.  BPL.S LFEA82E
  283.  ADDI.B #$B,D0
  284. LFEA82E:MULU #$440,D0
  285.  LEA $680(A0),A4
  286.  ADDA.L D0,A4
  287.  BTST #0,$40(A3)
  288.  BEQ.S LFEA866
  289.  MOVEA.L $5A(A3),A0
  290.  MOVE.L #$10,D0
  291.  LEA $10(A4),A1
  292.  JSR $FEAB4A
  293.  LEA 8(A4),A0
  294.  MOVE.W #$28,D1
  295.  JSR $FEADA4
  296.  LEA $30(A4),A0
  297.  JSR $FEAD46
  298. LFEA866:MOVEA.L $56(A3),A0
  299.  MOVE.L #$200,D0
  300.  LEA $40(A4),A1
  301.  JSR $FEAB4A
  302.  LEA $40(A4),A0
  303.  MOVE.W #$400,D1
  304.  JSR $FEADA4
  305.  LEA $38(A4),A0
  306.  JSR $FEAD46
  307.  BRA LFEA8D6
  308. LFEA890:MOVEQ #0,D0
  309.  BTST #0,$40(A3)                         ;SecLabel set?
  310.  BEQ.S LFEA8C4                           ;no
  311.  MOVE.B $49(A3),D0                       ;Sector number to D0
  312.  SUB.B 3(A0),D0
  313.  BPL.S LFEA8A0
  314.  ADDI.B #$B,D0
  315. LFEA8A0:MULU #$440,D0
  316.  LEA $680(A0),A4
  317.  ADDA.L D0,A4
  318.  LEA $10(A4),A1
  319.  MOVEA.L $5A(A3),A0
  320.  MOVE.L #$10,D0
  321.  JSR $FEACB2
  322. LFEA8C4:
  323.  clr.l d0
  324.  MOVE.B $49(A3),D0                       ;Sector number to D0
  325.  MOVEA.L $56(A3),A1                      ;destination address
  326.  lea TrackMemory1(pc),a0
  327.  clr.l d1
  328.  move.b $43(a3),d1
  329.  lsl.w #2,d1
  330.  adda.l d1,a0
  331.  movea.l (a0),a0
  332.  mulu #$200,d0
  333.  adda.l d0,a0
  334.  move.w #$200,d0
  335.  bsr CopyBlock
  336. LFEA8D6:MOVE.L #$200,D1
  337.  ADD.L D1,$56(A3)
  338.  MOVE.L $20(A2),D0
  339.  ADD.L D1,D0
  340.  MOVE.L D0,$20(A2)
  341.  BTST #0,$40(A3)
  342.  BEQ.S LFEA8FA
  343.  ADDI.L #$10,$5A(A3)
  344. LFEA8FA:CMP.L $24(A2),D0
  345.  BCC.S LFEA920
  346.  MOVEA.L $4E(A3),A2
  347.  ADDQ.B #1,$49(A3)
  348.  CMPI.B #$B,$49(A3)
  349.  BLT LFEA804
  350.  MOVE.B #0,$49(A3)
  351.  ADDQ.W #1,$4A(A3)
  352.  BRA LFEA7B8
  353. LFEA920:MOVEA.L $44(A3),A1
  354.  JSR $FEA1B0
  355.  BRA.S LFEA936
  356. LFEA92A:MOVEA.L $44(A3),A1
  357.  MOVE.B #-4,$1F(A1)
  358.  BRA.S LFEA920
  359. LFEA936:MOVEM.L (A7)+,A2-A4
  360.  RTS
  361. read1:         MOVEM.L A2,-(A7)
  362.                MOVEA.L $4E(A3),A2
  363.                MOVEQ #1,D0
  364.                jsr $FEA462               ;Motor on
  365. LFEA9AC:       MOVEQ #0,D0
  366.                MOVE.W $4A(A3),D0
  367.                jsr $FEA3DA               ;Head Posi.
  368. LFEA9B6:       LEA 1664(A2),A0
  369.                lea TrackMemory1(pc),a1
  370.                clr.l d0
  371.                move.b $43(a3),d0
  372.                lsl.w #2,d0
  373.                adda.l d0,a1
  374.                move.l (a1),a1
  375.                bsr trackread1
  376.                move.w FirstBlock(pc),D0
  377.                MOVE.B d0,3(A2)
  378.                lea ErrorFlag(pc),a0
  379.                tst.w (a0)
  380.                beq \Ende                 ;No Error
  381. \Error:        MOVE.B 1(a0),3(A2)        ;Store error
  382.                ADDQ.B #1,$42(A3)
  383.                MOVE.B $42(A3),D0
  384.                CMP.B $34(A3),D0
  385.                BGT.S \Ende               ;End too many errors
  386.                ANDI.B #3,D0
  387.                BNE.S LFEA9B6
  388.                MOVE.W #-1,$4C(A3)
  389.                BRA.S LFEA9AC
  390. \Ende:         MOVEM.L (A7)+,A2
  391.                RTS
  392.  
  393. ;Track read and decoder
  394. ;>= A1 = Pointer to buffer for decoded data
  395. ;>= A0 = Pointer to buffer for coded data
  396.  
  397. Trackread1:
  398.                MOVEM.L D2-D4/a4-a5,-(A7)
  399.                move.l a0,a5
  400.                move.l a1,a4
  401.                lea ErrorFlag(pc),a1
  402.                clr.w (a1)
  403.                lea DecodeNum(pc),a1               move.w #$080,(a1)         ;Number long words to  decode
  404.                lea $40(a5),a0
  405.                lea DecodeAdr(pc),a1
  406.                move.l a0,(a1)            ;Data area for 1. Blocks
  407.                adda.l #$400,a0
  408.                lea FTestAdr(pc),a1
  409.                move.l a0,(a1)            ;Address of next Block
  410.                jsr $FEADDC               ;Check drive
  411.                MOVE.B $41(A3),$BFD100
  412.                BTST #2,$BFE001           ;Disk in drive
  413.                BNE.S \FL3                ;Ok
  414.                lea ErrorFlag(pc),a1
  415.                move.w #NoDisk,(a1)       ;No disk in drive
  416.                BRA   \FL5                ;Ende
  417.  
  418. \FL3:          bsr Disable
  419.                move.l a6,-(a7)
  420.                MOVEA.L A5,A6             ;Track buffer
  421.                move.l #$aaaaaaaa,(a6)+
  422.                move.w #$4489,(a6)+       ;store first Sync
  423.                bsr search
  424.                tst.l d0
  425.                bpl \FL8
  426.                lea ErrorFlag(pc),a1
  427.                move.w #NoSync,(a1)       ;No Sync
  428.                bra \FL9                  ;End
  429. \FL8:          bsr FErase                ;Prepare track buffer
  430.                clr.l d2
  431.                move.w BytesBefGap(pc),d2 ;Num. of Bytes before Gap
  432.                tst.l d2
  433.                beq \FL1                  ;No Bytes before Gap
  434.                lea BlockAdr(pc),a1
  435.                clr.w (a1)                ;Offset im Block
  436.                bsr Numread1              ;Bytes read
  437.                clr.l d0
  438.                move.w BytesBefGap(pc),d0
  439.                move.l a5,a6
  440.                adda.l d0,a6              ;Pointer to next buffer
  441.                move.l #$aaaaaaaa,(a6)+
  442.                move.w #$4489,(a6)+       ;store first sync
  443. \FL1:          move.w BytesAftGap(pc),d2
  444.                tst.l d2
  445.                beq \FL2
  446.                lea BlockAdr(pc),a1
  447.                clr.w (a1)
  448.                bsr Numread1
  449.                bsr lastoneblock
  450. \FL2:          move.l #$aaaaaaaa,$2ec0(a5) ;Creat gap after data
  451.                BTST #2,$BFE001           ;Disk in drive?
  452.                bne   \FL9                ;Ok, Disk in Drive
  453.                lea ErrorFlag(pc),a1
  454.                move.w #NoDisk,(a1)
  455. \FL9:          move.l (a7)+,a6
  456. \FL5:          bsr Enable
  457.                jsr $FEAE42               ;drop drive
  458.                MOVEM.L (A7)+,D2-D4/a4-a5
  459.                RTS
  460.  
  461. ;Prepare track buffer (clrear block start)
  462. ;>= A5 = Pointer to track buffer
  463.  
  464. FErase:        move.l a5,a0
  465.                move.w #10,d1
  466.                clr.l d0
  467. \L1:           move.l d0,$440(a0)
  468.                adda.l #$440,a0
  469.                dbf d1,\L1
  470.                lea BlockReport1(pc),a0
  471.                move.w #10,d1
  472. \L2:           clr.w (a0)+
  473.                dbf d1,\L2
  474.                rts
  475.  
  476. ;Read set number of bytes
  477. ;>= A6 = Pointer to destination
  478. ;>= D2 = Number of bytes to read
  479.  
  480. Numread1:
  481.                bsr install
  482.                MOVE.W D2,D0
  483.                LSR.W #1,D0
  484.                ORI.W #$8000,D0
  485.                add.w #1,d0
  486.                MOVE.W D0,36(A1)
  487.                MOVE.W D0,36(A1)
  488.                bsr decode
  489.                LEA $DFF000,A1
  490.                MOVE.W #$4000,$24(A1)
  491.                rts
  492.  
  493. ;Prepare to read
  494. ;>= A6 Pointer to track buffer
  495.  
  496. install:       LEA $DFF000,A1
  497.                move.w #$4000,$24(a1)     ;set Disk-Len back
  498.                move.w #$8400,$9e(a1)     ;switch on Disk Sync
  499.                move.w #$4489,$7e(a1)     ;SYNC-Mark
  500.                MOVE.L A6,$20(A1)         ;pass buffer
  501.                move.w #$0002,$dff09c
  502.                rts
  503.  
  504. ;Code long wor dand enterinto buffer
  505. ;>= D0 = Long word
  506. ;>= A0 = Pointer to buffer
  507.  
  508. CodeLWort:     MOVEM.L D2-D3,-(A7)
  509.                MOVE.L D0,D3
  510.                LSR.L #1,D0
  511.                BSR \CH1
  512.                MOVE.L D3,D0
  513.                BSR \CH1
  514.                BSR Randsetone
  515.                MOVEM.L (A7)+,D2-D3
  516.                RTS
  517. \CH1:          ANDI.L #$55555555,D0
  518.                MOVE.L D0,D2
  519.                EORI.L #$55555555,D2
  520.                MOVE.L D2,D1
  521.                LSL.L #1,D2
  522.                LSR.L #1,D1
  523.                BSET #$1F,D1
  524.                AND.L D2,D1
  525.                OR.L D1,D0
  526.                BTST #0,-1(A0)
  527.                BEQ.S \CH2
  528.                BCLR #$1F,D0
  529. \CH2:          MOVE.L D0,(A0)+
  530.                RTS
  531. ;set border
  532.  
  533. Randsetone:    MOVE.B (A0),D0
  534.                BTST #0,-1(A0)
  535.                BNE.S \CH4
  536.                BTST #6,D0
  537.                BNE.S \CH6
  538.                BSET #7,D0
  539.                BRA.S \CH5
  540. \CH4:          BCLR #7,D0
  541. \CH5:          MOVE.B D0,(A0)
  542. \CH6:          RTS
  543.  
  544. ;determine checksum
  545. ;>= D1 = Number of Bytes (must be divisible by 4)
  546. ;>= A0 = Pointer to buffer
  547. ;=> D0 = Check sum
  548.  
  549. CheckSum:      MOVE.L D2,-(A7)
  550.                LSR.W #2,D1
  551.                SUBQ.W #1,D1
  552.                MOVEQ #0,D0
  553. \PS1:          MOVE.L (A0)+,D2
  554.                EOR.L D2,D0
  555.                DBRA D1,\PS1
  556.                ANDI.L #$55555555,D0
  557.                MOVE.L (A7)+,D2
  558.                RTS
  559.  
  560. ;Decode block header
  561. ;>= A0 is pointer to header
  562. ;=> D0 = Header
  563.  
  564. Header:        move.l (a0)+,D0
  565.                move.l (a0)+,D1
  566.                andi.l #$55555555,d0
  567.                andi.l #$55555555,d1
  568.                lsl.l #1,D0
  569.                or.l D1,D0
  570.                rts
  571.  
  572. ;find first block
  573. ;=> A6 = Pointer to track buffer
  574. ;=> D0 = Null: Block found
  575. ;=> BytesBefGap = Number of Bytes before the Gap
  576. ;=> BytesAftGap = Number of Bytes after the Gap
  577.  
  578. search:                       movem.l d2-d4/a2,-(a7)
  579.                move.w #11,d2             ;Number of errors permitted
  580. \SU1:          bsr install
  581.                move.w #$8024,d0          ;$24 Words read
  582.                MOVE.W D0,$dff024
  583.                MOVE.W D0,$dff024
  584.                bsr Blockready            ;wait for ready Block
  585.                tst.l d0                  ;Error, then D0 = -1
  586.                bmi \SUError
  587.  
  588.                lea 8(a5),a0              ;Pointer to Blockheader
  589.                moveq #$28,d1             ;number of long words
  590.                bsr CheckSum              ;Sum for Header
  591.                move.l d0,d3              ;Sum stored
  592.                lea 48(a5),a0             ;*Sum
  593.                bsr Header                ;get sum from Header
  594.                cmp.l d0,d3               ;compare sums
  595.                bne \SUNeu
  596.                lea 8(a5),a0
  597.                bsr Header                ;Header decode
  598.                move.w d0,d3              ;Header to D3
  599.                lsr.w #8,d3
  600.                andi.w #$00ff,d3          ;isolate sector number
  601.                addi.w #1,d3              ;incr. sector number
  602.                cmp.w #$000a,d3           ;Nummer > 10?
  603.                bls \SU2                  ;No, OK
  604.                clr.w d3                  ;Number = 0
  605. \SU2:          lea SectNum(pc),a2
  606.                move.w d3,(a2)            ;Store number
  607.                lea FirstBlock(pc),a2
  608.                move.w d3,(a2)            ;Number of first block
  609.  
  610.                move.w d0,d3              ;Header
  611.                andi.w #$ff,d3            ;Sectors to gap
  612.                cmp.b #$0c,d3             ;Header OK?
  613.                bcs.s \SUok
  614. \SUNeu:        dbf d2,\SU1
  615.                bra \SUError
  616. \SUok:
  617.  
  618.                sub.w #1,d3               ;Num. of blocks to gap
  619.                move.w d3,d2
  620.                move.w #$000b,d4
  621.                sub.b d2,d4               ;Num. of blocks after gap
  622.                mulu #$440,d3             ;Num. of bytes to gap
  623.                mulu #$440,d4             ;Num. of bytes to gap
  624.                clr.l d0
  625.                lea BytesBefGap(pc),a2
  626.                move.w d3,(a2)
  627.                lea BytesAftGap(pc),a2
  628.                move.w d4,(a2)
  629.                lea SectBL(pc),a2
  630.                move.w #$0b,(a2)          ;Sectors before gap to load
  631.                bra \SUEnd
  632. \SUError:      move.l #-1,d0
  633.                lea ErrorFlag(pc),a2
  634.                move.w #ReadError,(a2)
  635. \SUEnd:        movem.l (a7)+,d2-d4/a2
  636.                rts
  637.  
  638. Blockready:    clr.l d0                  ;Error-Flag cleared
  639.                move.l #$20000,d1
  640.                move.w #$0002,$dff09c     ;DiskInt cleared
  641. \B1:           MOVE.W $DFF01E,D0
  642.                BTST #1,D0
  643.                bne.s \B2
  644.                sub.l #1,d1
  645.                bne \B1
  646.                move.l #-1,d0             ;Error occoured
  647. \B2:           RTS
  648.  
  649.  
  650. ;decode bytes, unitl block ead
  651.  
  652. decode:
  653.                movem.l d2-d4/a2-a3,-(a7)
  654.                clr.l d3
  655.                move.l a3,d4              ;save drive-prot
  656.                move.w BlockAdr(pc),d3    ;Offset in Block
  657.                move.l FTestAdr(pc),a0    ;Address to test if
  658.                                          ;Block already loaded
  659.                move.l DecodeAdr(pc),a2       ;Address, decode is done
  660.                move.w DecodeNum(pc),d2       ;Number for decoding
  661.  
  662. \DC1:          MOVE.W $DFF01E,D0
  663.                BTST #1,D0                ;Area read already
  664.                bne  \DCEnd               ;Yes, end
  665.                tst.l (a0)                ;TestAdr
  666.                beq \DC1                  ;Wait, until block read
  667.  
  668.                movem.l a0-a1,-(a7)       ;save registern
  669.                lea -$40(a2),a1           ;* Block Start
  670.                move.l d4,a3              ;* Drive-Port
  671.                bsr BlockCheck            ;Block check
  672.                movem.l (a7)+,a0-a1       ;restore Register
  673.                move.w SectNum(pc),d0
  674.                mulu #$200,d0
  675.                move.l a4,a1              ;Basic address for dest. data
  676.                add.l d0,a1               ;Address of the Blocks
  677. \DC2:
  678.                MOVE.W $DFF01E,D0
  679.                BTST #1,D0
  680.                bne.s \DCEnd              ;area already read
  681.  
  682.                move.l (a2),D0
  683.                move.l $200(a2),D1
  684.                adda.l #4,a2
  685.                andi.l #$55555555,d0
  686.                andi.l #$55555555,d1
  687.                lsl.l #1,D0
  688.                or.l D1,D0
  689.                move.l d0,(a1,d3)         ;store long word
  690.                addq.w #4,d3
  691.                subq.w #1,D2              ;Decode number
  692.                bne \DC2
  693.                adda.l #$240,a2           ;incr. Address
  694.                adda.l #$440,a0           ;TestAdr
  695.                move.l #$080,D2           ;Decode number
  696.                clr.w d3                  ;Offset to Null
  697.                lea SectNum(pc),a3
  698.                add.w #1,(a3)             ;incr. Sector number
  699.                cmp.w #$0b,(a3)           ;Nummer > 10?
  700.                bcs \DC3                  ;No, OK
  701.                clr.w (a3)                ;Number = 0
  702. \DC3:          bra \DC1
  703.  
  704. \DCEnd:
  705.                lea BlockAdr(pc),a3
  706.                move.w d3,(a3)
  707.                lea DecodeAdr(pc),a3
  708.                move.l a2,(a3)
  709.                lea FTestAdr(pc),a3
  710.                move.l a0,(a3)
  711.                lea DecodeNum(pc),a3
  712.                move.w D2,(a3)
  713.  
  714.                movem.l (a7)+,d2-d4/a2-a3
  715.                RTS
  716.  
  717. ;decode last block
  718.  
  719. lastoneblock:                 movem.l d2-d3/a2,-(a7)
  720.  
  721.                move.w SectNum(pc),d0
  722.                mulu #$200,d0
  723.                move.l a4,a1              ;Basic addres for dest. data
  724.                add.l d0,a1               ;Address of the blocks
  725.                clr.l d3
  726.                move.l DecodeAdr(pc),a2
  727.                move.w DecodeNum(pc),d2
  728. \LB1:          move.l (a2),D0
  729.                move.l $200(a2),D1
  730.                adda.l #4,a2
  731.                andi.l #$55555555,d0
  732.                andi.l #$55555555,d1
  733.                lsl.l #1,D0
  734.                or.l D1,D0
  735.                move.l d0,(a1,d3)
  736.                addq.w #$4,d3
  737.                subq.w #1,D2               ;Decode number
  738.                bne \LB1
  739.                movem.l (a7)+,d2-d3/a2
  740.                               RTS
  741.  
  742. ;test Block for Errors
  743. ;A1 = Pointer to BlockStart
  744.  
  745. BlockCheck:
  746.                movem.l d2-d3/a2,-(a7)
  747.                clr.l d3
  748.                move.w SectNum(pc),d3
  749.                lsl.w #1,d3               ;Sector number => Offset
  750.                lea BlockReport1(pc),a0
  751.                move.w (a0,d3),d0         ;get entry
  752.                tst.w d0                  ;already tested?
  753.                bne \CBEnd2               ;Yes, end
  754.  
  755.                lea 64(a1),a0
  756.                move.w #$400,d1
  757.                bsr CheckSum              ;Sum for Data block
  758.                move.l d0,d2              ;save sum
  759.                lea 56(a1),a0             ;Pointer to Data sum
  760.                bsr Header                ;Sum decoder
  761.                cmp.l d0,d2
  762.                bne \DataIsFalse
  763.  
  764.                lea 8(a1),a0
  765.                bsr Header                ;Header decode
  766.                move.w d0,d2              ;store lowere word
  767.                lsr.w #8,d2               ;Sector number to d2
  768.                cmp.b SectNum+1(pc),d2        ;rright Sector
  769.                bne \FalseoneSector
  770.                swap d0                   ;Track number to D0
  771.                cmp.b 77(a3),d0           ;right Track?
  772.                bne \FalseoneTrack
  773.                andi.l #$ff00,d0
  774.                cmp.w #$ff00,d0
  775.                bne \KeinDosTrack
  776.                lea 8(a1),a0
  777.                moveq #$28,d1             ;long wor dnumber
  778.                bsr CheckSum              ;Sum for Header
  779.                move.l d0,d2              ;save sum
  780.                lea 48(a1),a0             ;*Sum
  781.                bsr Header                ;get sum from Header
  782.                cmp.l d0,d2               ;compare sum
  783.                bne \Header1False
  784.                move.w #$ffff,d0
  785. \CBEnd1:       lea BlockReport1(pc),a0
  786.                move.w d0,(a0,d3)
  787.                btst #0,-1(a1)
  788.                beq \CB1
  789.                move.l #$2aaaaaaa,(a1)
  790.                bra \CB2
  791. \CB1:          move.l #$aaaaaaaa,(a1)
  792. \CB2:          move.l #$44894489,4(a1)
  793.                move.w #$ff00,d0          ;create new Header
  794.                move.b 77(a3),d0
  795.                swap d0
  796.                move.b SectNum+1(pc),d0
  797.                lsl.w #8,d0
  798.                move.b SectBL+1(pc),d0
  799.                lea 8(a1),a0
  800.                bsr CodeLWort             ;store Header
  801.                lea 8(a1),a0
  802.                moveq #$28,d1             ;long word number
  803.                bsr CheckSum              ;Sum for Header
  804.                lea 48(a1),a0             ;*Sum
  805.                bsr CodeLWort             ;Checksum stored
  806.                lea SectBL(pc),a2
  807.                subq.w #1,(a2)
  808. \CBEnd2:       movem.l (a7)+,d2-d3/a2
  809.                rts
  810.  
  811. \FalseoneSector: move.w #$0017,d0
  812.                  bra \Flagsetone
  813. \FalseoneTrack: move.w #$0017,d0
  814.                  bra \Flagsetone
  815. \KeinDosTrack:  move.w #$0017,d0
  816.                  bra \Flagsetone
  817. \Header1False:  move.w #$001b,d0
  818.                  bra \Flagsetone
  819. \DataIsFalse:   move.w #$0019,d0
  820. \Flagsetone:    lea ErrorFlag(pc),a2
  821.                 move.w d0,(a2)
  822.                 bra \CBEnd1
  823.  
  824. ;Data bock coded
  825. ;>= D0 = Length of source
  826. ;>= A0 = Pointer to Source
  827. ;>= A1 = Pointer to Dest.
  828.  
  829. CopyBlock:
  830.                move.l a2,-(a7)
  831.                move.l a0,a2
  832.                LSL.W #2,D0
  833.                ORI.W #8,D0
  834.                lea $dff000,a0
  835.                bsr BlitWait
  836.                bsr BlitterCode
  837.                move.l (a7)+,a2
  838.                RTS
  839.  
  840. ;A0 = $dff000
  841. ;D0 = Length of source
  842. ;D1 = Source
  843. ;A5 = Dest
  844.  
  845. BlitterCode:
  846.                bsr Modulu                ;set Modulu
  847.                MOVE.L a2,$50(A0)         ;Source
  848.                MOVE.L a1,$54(A0)         ;Dest
  849.                MOVE.W #$09F0,$40(A0)
  850.                MOVE.W #0,$42(A0)
  851.                bsr StartBlit
  852.                rts
  853.  
  854. ;Blit start and wait for end of Blitter
  855.  
  856. StartBlit:
  857.                MOVE.W d0,$dff058
  858. BlitWait:      btst #14,$dff002
  859.                bne.s BlitWait
  860.                rts
  861.  
  862. ;Modulu for coding set
  863. ;>= A0 = $dff000
  864. Modulu:
  865.                movem.l d0/a1,-(a7)
  866.                MOVEQ #0,D0
  867.                LEA $44(A0),A1
  868.                MOVE.L #-1,(A1)
  869.                LEA $62(A0),A1
  870.                MOVE.L D0,(A1)+
  871.                MOVE.W D0,(A1)+
  872.                movem.l (a7)+,d0/a1
  873.                rts
  874.  
  875.  
  876.  
  877. BytesBefGap:   dc.w 0
  878. BytesAftGap:   dc.w 0
  879. ErrorFlag:     dc.w 0
  880. DecodeNum:     dc.w 0
  881. DecodeAdr:     dc.l 0
  882. FTestAdr:      dc.l 0
  883. BlockAdr:      dc.w 0
  884. SectNum:       dc.w 0
  885. FirstBlock:    dc.w 0
  886. SectBL:        dc.w 0
  887. TrackMemory1:dc.l 0
  888. TrackMemory2:dc.l 0
  889. TrackMemory3:dc.l 0
  890. TrackMemory4:dc.l 0
  891.  
  892. BlockReport1:  ds.w 11
  893.  
  894. TrackName:     dc.b 'trackdisk.device',0,0
  895. Ende:
  896.                END
  897.  
  898.